package config

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/plugin/dbresolver"
    "time"
)

var DB *gorm.DB

func MustInitDB() {
    db, err := gorm.Open(mysql.New(mysql.Config{
        DSN: fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
            Config.DB.Username,
            Config.DB.Password,
            Config.DB.Host,
            Config.DB.Port,
            Config.DB.Database,
        ), // DSN data source name
        // DefaultStringSize:         256,                                                                        // string 类型字段的默认长度
        // DisableDatetimePrecision:  true,                                                                       // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
        // DontSupportRenameIndex:    true,                                                                       // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
        // DontSupportRenameColumn:   true,                                                                       // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
        // SkipInitializeWithVersion: false,                                                                      // 根据当前 MySQL 版本自动配置
    }), &gorm.Config{})
    if err != nil {
        panic(fmt.Sprintf("connect database error: %v", err))
    }

    // 配置读写分离
    err = db.Use(dbresolver.Register(dbresolver.Config{
        // 主库配置
        Sources: []gorm.Dialector{
            mysql.Open("user:pass@tcp(primary:3306)/db_name"),
        },
        // 从库配置
        Replicas: []gorm.Dialector{
            mysql.Open("user:pass@tcp(replica1:3306)/db_name"),
            mysql.Open("user:pass@tcp(replica2:3306)/db_name"),
        },
        Policy:            dbresolver.RandomPolicy{},
        TraceResolverMode: true,
    }).SetConnMaxIdleTime(time.Hour). //
        SetConnMaxLifetime(24 * time.Hour). // SetConnMaxLifetime 设置了连接可复用的最大时间。
        SetMaxIdleConns(10). // SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。
        SetMaxOpenConns(100)) // SetMaxOpenConns 设置打开数据库连接的最大数量。

    DB = db
}
